using CSV
using DataFrames
using StatsBase
using Distributions
using Plots
using HypothesisTests
using StatsPlots

# 读取 Excel 文件中的数据
filename = "漂移测试1124_1小时.csv"  # 替换为您的文件名
data = DataFrame(CSV.File(filename))

# 提取各列数据
point_numbers = data[:, 1]
timestamps = data[:, 2]
temperatures = data[:, 3]
measurements = data[:, 4]
start = 1000
measurements = measurements[start:(start+300)]

# 检查噪声的分布特性
# 绘制直方图
histogram(measurements, bins=100, label="Noise Distribution", normalize=true, alpha=0.7)
fit_dist = fit(Normal, measurements)
plot!(fit_dist, label="fitted normal distribution", linewidth=2, color=:red)
xlabel!("noise")
ylabel!("pdf")
title!("noise_analysis")
savefig("measurements_distribution.png")

## Q-Q 图

# 使用 Q-Q 图来比较测量值与理论正态分布的分位数。
# 如果数据符合正态分布，Q-Q 图上的点应该接近一条直线。

normal_dist = Normal(mean(measurements), std(measurements))
qqplot(measurements, normal_dist, label="Q-Q Plot", legend=:topright)
xlabel!("Theoretical Quantile")
ylabel!("Sample Quantile")
title!("Q-Q fig")
savefig("qq_plot.png")

## 正态性检验

# 该检验计算一个统计量 W，该统计量衡量样本数据与正态分布的拟合程度。
# W 值越接近 1，表示数据越符合正态分布。

# 检验结果通常包括统计量 W 和 p 值。p 值是一个概率值，
# 表示如果原假设（即数据来自正态分布）为真时，观察到当前或更极端的数据的概率。
# 如果 p 值小于显著性水平（通常是 0.05），
# 则拒绝原假设，认为数据不符合正态分布；
# 否则，不能拒绝原假设，认为数据符合正态分布。

shapiro_test_result = ShapiroWilkTest(measurements)
println("Shapiro-Wilk 检验结果: ", shapiro_test_result)

## 检查噪声的时间相关性

# 自相关函数 (ACF) 用于分析时间序列数据中不同时间点之间的相关性。
# 对于高斯白噪声，自相关函数在非零滞后时应接近于零。

# 计算测量值在不同滞后下的自相关系数。滞后是指两个时间点之间的时间间隔。
# 绘制自相关函数图，显示不同滞后下的自相关系数。

# 如果数据是高斯白噪声，自相关函数在非零滞后时应该接近于零。

lags = 100  # 计算前 100 个滞后
acf = autocor(measurements, 1:lags, demean=true)
plot(0:lags-1, acf, label="autocorrelation function", linewidth=2, color=:blue, legend=:topright)
hline!([0], linestyle=:dash, color=:black, label="zero line")
xlabel!("lack")
ylabel!("autocorrelation coefficient")
title!("autocorrelation function")
savefig("autocorrelation.png")

# 输出结果
println("噪声的均值: ", mean(measurements))
println("噪声的标准差: ", std(measurements))
println("噪声的中位数: ", median(measurements))
println("拟合的正态分布参数: μ = $(fit_dist.μ), σ = $(fit_dist.σ)")